#include <STC/STC89C5xRC.H>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DU = P2 ^ 6; // 数码管段选
sbit WE = P2 ^ 7; // 位选

sbit key_s2 = P3 ^ 0; // 独立按键S2
sbit key_s3 = P3 ^ 1; // 独立按键S3

uchar num; // 数码管显示的值

/**
 * 共阴数码管段选表 0~9
 */
uchar code table[] = {
	0x3f,
	0x06,
	0x5b,
	0x4f,
	0x66,
	0x6d,
	0x7d,
	0x07,
	0x7f,
	0x6f,
};

/**
 * 毫秒级延时
 * 12T
 * Fosc = 11.0592 MHz
 * @param ms 延时毫秒数，设定的取值范围：0~65535
 */
void delay(uint ms)
{
	uint x, y;
	for (x = ms; x > 0; x--)
		for (y = 114; y > 0; y--)
			;
}

/**
 * 独立按键识别
 * 【使用说明】
 * 按下开发板左下角S2按键，数码管显示的值加1，最大加到9；按下S3，值减1，最小减到0
 */
void main()
{
	WE = 1;	   // 位选锁存器直通使能
	P0 = 0xfe; // 选通数码管第一位，1111 1110
	WE = 0;	   // 锁存位选数据

	while (1)
	{
		// 自增
		if (!key_s2) // 判断是否按下S2
		{
			delay(20); // 按键消抖
			if (!key_s2)
			{
				if (num != 9) // 如果值不等于9则加1，将值限定为小于9
					num++;
				while (!key_s2) // 松手检测
					;
			}
		}

		// 自减
		if (!key_s3) // 判断是否按下S3
		{
			delay(20); // 按键消抖
			if (!key_s3)
			{
				if (num > 0) // 如果值大于0则减1，将值限定为不小于0
					num--;
				while (!key_s3) // 松手检测
					;
			}
		}

		// 松手后刷新显示
		DU = 1; // 段选锁存器直通使能
		P0 = table[num];
		DU = 0; // 锁存段选数据
	}
}
